/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */


function ListNode(val, next) {
  this.val = val === undefined ? 0 : val;
  this.next = next === undefined ? null : next;
}

var addTwoNumbers = function (l1, l2) {
  let l3 = null; // 初始化
  let temp = null;
  let flag = 0; // 判断是否需要进位

  while (l1 || l2) {
    // 当某一个链表结束，使用空值
    if (!l1) {
      l1 = new ListNode();
    }
    if (!l2) {
      l2 = new ListNode();
    }
    // 每轮循环的和
    const sum = l1.val + l2.val + flag;
    flag = Math.floor(sum / 10); // 两个单数相加最大为18

    if (!temp) {
      // 第一次初始化；l3始终是指向最外层初始化的对象
      l3 = temp = new ListNode(sum % 10);
    } else {
      // 这里面的temp的指向在一层层的往里面深入扩展next属性；此时l3一直是最外层的对象
      temp.next = new ListNode(sum % 10);
      temp = temp.next;
    }

    // 最后将next赋给自己执行下一轮循环；在开头做了判断不会报错
    l1 = l1.next;
    l2 = l2.next;
  }
  // 循环结束判断是否进位
  if (flag) {
    temp.next = new ListNode(flag);
  }

  return l3;
};

let l1 = {
  val: 3,
  next: {
    val: 4,
    next: {
      val: 2,
      next: {
        val: 7,
        next: null,
      },
    },
  },
};

let l2 = {
  val: 9,
  next: {
    val: 9,
    next: {
      val: 9,
      next: null,
    },
  },
};

let demo = addTwoNumbers(l1, l2);
console.log(demo);

//#region
/* var addTwoNumbers = function (l1, l2) {
  let l3 = [];
  // 保证l1最长
  if (l1.length < l2.length) {
    l3 = l2;
    l2 = l1;
    l1 = l3;
    l3 = []; // 还原
  }
  // 判断当前相加是否>=10;要进位
  let flag = 0;
  for (let i = 0; i < l1.length; i++) {
    // 短的数组加完了
    if (i > l2.length - 1) {
      if (flag) {
        // 1.上一轮加法>=10
        if (l1[i] + flag>=10){
          l3.push(l1[i] + flag - 10);
          flag = 1;
        } else {
          l3.push(l1[i] + flag);
          flag = 0;
        }
      } else {
        // 2.上一轮和<10
        if (l1[i] + flag>=10){
          l3.push(l1[i] + flag - 10);
          flag = 1;
        } else {
          l3.push(l1[i] + flag);
          flag = 0;
        }
      }
    } else {
      if (l1[i] + l2[i] + flag >= 10) {
        // 情况1：相加>=10
        l3.push(l1[i] + l2[i] + flag - 10);
        flag = 1;
      } else {
        // 情况2：相加<10
        l3.push(l1[i] + l2[i] + flag);
        flag = 0;
      }
    }
    // 情况3：l2计算完毕
  }

  // for循环结束，判断最后一次是否>10
  if(flag) {
    l3.push(1);
  }
  return l3;
};

const l1 = [9, 9, 9, 9, 9, 9, 9];
const l2 = [9, 9, 9, 9];

let demo = addTwoNumbers(l1, l2);
console.log(demo); */

//#endregion
